/*!
 * \file WtSimpRiskMon.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 *
 * \brief 简单风控监控器类定义文件
 *		  本文件定义了WtSimpleRiskMon简单风控监控器类
 *		  实现基于回撤控制的风险管理策略，支持日内和多日回撤监控
 *		  提供实时风险监控、仓位控制、资金管理等核心风控功能
 *		  采用独立线程运行，确保风控监控的实时性和可靠性
 */
#pragma once
#include <thread>
#include <memory>

#include "../Includes/RiskMonDefs.h"

USING_NS_WTP;

/**
 * @class WtSimpleRiskMon
 * @brief 简单风控监控器类
 * @details 简单风控监控器实现，继承自WtRiskMonitor基类
 *          主要功能包括：
 *          1. 日内回撤监控 - 监控当日最大回撤，超过阈值时降低仓位
 *          2. 多日回撤监控 - 监控历史最大回撤，超过阈值时清空仓位
 *          3. 盈利保护 - 当盈利超过基础比例时启动回撤保护
 *          4. 实时监控 - 独立线程定期检查风险指标
 *          5. 动态仓位控制 - 根据风险状况动态调整仓位规模
 *          
 *          风控策略：
 *          - 策略1：当组合的盈利超过基础盈利比例时，启动回撤保护
 *          - 策略2：定期检查，从最高点回撤超过阈值时触发风控
 *          
 *          风控措施：
 *          - 方式A：降低品种仓位到指定比例，等待下一个交易信号
 *          - 方式B：平掉盈利品种仓位，等待下一个交易信号
 */
class WtSimpleRiskMon : public WtRiskMonitor
{
public:
	/**
	 * @brief 构造函数
	 * @details 初始化简单风控监控器，设置默认状态
	 *          _stopped: 停止标志，初始为false
	 *          _limited: 限制标志，初始为false
	 */
	WtSimpleRiskMon() :_stopped(false), _limited(false){}

public:
	/**
	 * @brief 获取监控器名称
	 * @return 返回监控器名称字符串
	 * @details 返回当前风控监控器的标识名称
	 *          用于监控器识别和日志记录
	 */
	virtual const char* getName() override;

	/**
	 * @brief 获取工厂名称
	 * @return 返回所属工厂名称字符串
	 * @details 返回创建此监控器的工厂名称
	 *          用于工厂验证和管理
	 */
	virtual const char* getFactName() override;

	/**
	 * @brief 初始化风控监控器
	 * @param ctx 组合上下文指针
	 * @param cfg 配置参数
	 * @details 根据配置参数初始化风控监控器
	 *          加载风控参数，包括检查频率、回撤阈值、基础资金等
	 *          输出初始化日志，记录关键参数信息
	 */
	virtual void init(WtPortContext* ctx, WTSVariant* cfg) override;

	/**
	 * @brief 启动风控监控
	 * @details 启动独立监控线程，开始实时风险监控
	 *          监控线程会定期检查组合风险指标
	 *          根据风险状况执行相应的风控措施
	 */
	virtual void run() override;

	/**
	 * @brief 停止风控监控
	 * @details 停止监控线程，结束风险监控
	 *          设置停止标志，等待线程安全退出
	 */
	virtual void stop() override;

private:
	typedef std::shared_ptr<std::thread> ThreadPtr;
	ThreadPtr		_thrd;				///< 监控线程智能指针
	bool			_stopped;			///< 停止标志，控制监控线程运行状态
	bool			_limited;			///< 限制标志，标识是否已触发风控限制

	uint64_t		_last_time;			///< 上次检查时间戳，用于控制检查频率

	uint32_t		_calc_span;			///< 计算时间间隔，单位秒
	uint32_t		_risk_span;			///< 回撤比较时间窗口，单位分钟
	double			_basic_ratio;		///< 基础盈利比例，触发风控保护的盈利阈值
	double			_risk_scale;		///< 风控仓位控制系数，触发风控时的仓位比例
	double			_inner_day_fd;		///< 日内最高点回撤阈值，超过此值触发日内风控
	bool			_inner_day_active;	///< 日内风控开关，是否启用日内回撤监控
	double			_multi_day_fd;		///< 多日最高点回撤阈值，超过此值触发多日风控
	bool			_multi_day_active;	///< 多日风控开关，是否启用多日回撤监控
	double			_base_amount;		///< 基础资金金额，用于计算相对收益率
};